package controller

import (
	"ginblog/enum"
	"ginblog/model"
	"ginblog/resp"
	"ginblog/service"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

type CategoryController struct {
	cate service.CategoryService
	r    resp.Resp
}

type CategoryConInterface interface {
	AddCategory(c *gin.Context)
	GetCategoryById(c *gin.Context)
	GetCategorys(c *gin.Context)
	EditCategory(c *gin.Context)
	DeleteCategory(c *gin.Context)
}

// AddCategory 添加分类
func (cate *CategoryController) AddCategory(c *gin.Context) {
	// 获取前台传递得到数据
	category := model.Category{}
	err := c.ShouldBind(&category)
	if category.Name == "" {
		cate.r.RespData(enum.ERROR, enum.ERROR.String(), "分类名不能为空！", c)
		return
	}

	if err != nil {
		cate.r.RespData(enum.ERROR, enum.ERROR.String(), "数据格式有误！", c)
		return
	}

	// 查询分类名是否被使用
	code := cate.cate.CheckCategory(category.Name)
	if code != enum.SUCCESS {
		cate.r.RespData(code, code.String(), nil, c)
		return
	}

	// 添加分类到数据库
	code1 := cate.cate.CreateCategory(&category)
	if code1 != enum.SUCCESS {
		cate.r.RespData(code1, code1.String(), nil, c)
		return
	}

	cate.r.RespData(code1, code1.String(), "分类添加成功！", c)
}

// GetCategoryById 查询单个分类
func (cate *CategoryController) GetCategoryById(c *gin.Context) {
	// 获取前端传递的参数
	// 获取id
	cateId, _ := strconv.Atoi(c.Param("id"))
	category, code := cate.cate.GetCategoryById(cateId)
	if code != enum.SUCCESS {
		cate.r.RespData(code, code.String(), nil, c)
		return
	}
	cate.r.RespData(code, code.String(), category, c)
}

// GetCategorys 查询分类列表
func (cate *CategoryController) GetCategorys(c *gin.Context) {
	// 获取用户传输的数据
	// 获取前端传过来的数据 并转换给int类型
	pageSize, _ := strconv.Atoi(c.Query("pageSize"))
	pageNum, _ := strconv.Atoi(c.Query("pageNum"))
	// 判断数据
	if pageNum == 0 {
		pageNum = -1
	}

	cates, count := cate.cate.GetCategorys(pageSize, pageNum)
	c.JSON(http.StatusOK, gin.H{
		"status":  enum.SUCCESS,
		"message": enum.SUCCESS.String(),
		"data":    cates,
		"total":   count,
	})
}

// EditCategory 编辑分类
func (cate *CategoryController) EditCategory(c *gin.Context) {
	// 获取前端传递的参数
	// 获取id
	cateId, _ := strconv.Atoi(c.Param("id"))
	// 获取修改的数据
	category := model.Category{}
	err := c.ShouldBind(&category)
	if category.Name == "" {
		cate.r.RespData(enum.ERROR, enum.ERROR.String(), "分类名不能为空！", c)
		return
	}
	if err != nil {
		cate.r.RespData(enum.ERROR, enum.ERROR.String(), "数据格式有误！", c)
	}

	// 查询分类名是否被使用
	code := cate.cate.CheckCategory(category.Name)
	if code != enum.SUCCESS {
		cate.r.RespData(code, code.String(), nil, c)
		return
	}
	code1 := cate.cate.EditCategory(cateId, &category)
	if code1 != enum.SUCCESS {
		cate.r.RespData(code1, code1.String(), nil, c)
		return
	}
	cate.r.RespData(enum.SUCCESS, enum.SUCCESS.String(), "修改成功！", c)
}

// DeleteCategory 删除分类
func (cate *CategoryController) DeleteCategory(c *gin.Context) {
	// 获取前端传递的参数
	// 获取id
	cateId, _ := strconv.Atoi(c.Param("id"))

	code := cate.cate.DeleteCategory(cateId)

	if code != enum.SUCCESS {
		cate.r.RespData(code, code.String(), "", c)
		return
	}
	cate.r.RespData(code, code.String(), "删除成功！", c)
}
